\input{tex/question03.tex}

\subsection{标准答案}

\begin{minted}[mathescape,	
    linenos,
    numbersep=5pt,
    gobble=2,
    frame=lines,
    framesep=2mm,
    breaklines]{c++}
    template<>
    struct std::formatter<Frac>:std::formatter<char>{
        auto format(const auto& frac, auto& ctx)const{//const修饰是必须的
            return std::format_to(ctx.out(), "{}/{}", frac.a, frac.b);
        }
    };
    void print(std::string_view fmt,auto&&...args){
        std::cout << std::vformat(fmt, std::make_format_args(args...));
    }
\end{minted}

\subsection{解析}

实现一个 print 很简单，我们只要按第二题的思路来就行了，一个格式化字符串，用 std::string\_view 做第一个形参，另外需要接受任意参数和个数的参数，使用形参包即可。

\begin{minted}[mathescape,	
    linenos,
    numbersep=5pt,
    gobble=2,
    frame=lines,
    framesep=2mm,
    breaklines]{c++}
    void print(std::string_view fmt,auto&&...args){
        std::cout << std::vformat(fmt, std::make_format_args(args...));
    }
\end{minted}

这里实现策略使用了 C++20 简写函数模板。这两个格式化函数没必要再介绍，和第二题的作用一样，很简单的调库。

\clearpage